package com.zjsru.plan2024.oneday;

/**
 * @Author: cookLee
 * @Date: 2024-01-01
 * 经营摩天轮的最大利润
 */
public class MinOperationsMaxProfit {

    /**
     * 主
     * \
     * 输入：customers = [8,3], boardingCost = 5, runningCost = 6
     * 输出：3
     * 解释：座舱上标注的数字是该座舱的当前游客数。
     * 1. 8 位游客抵达，4 位登舱，4 位等待下一舱，摩天轮轮转。当前利润为 4 * $5 - 1 * $6 = $14 。
     * 2. 3 位游客抵达，4 位在等待的游客登舱，其他 3 位等待，摩天轮轮转。当前利润为 8 * $5 - 2 * $6 = $28 。
     * 3. 最后 3 位游客登舱，摩天轮轮转。当前利润为 11 * $5 - 3 * $6 = $37 。
     * 轮转 3 次得到最大利润，最大利润为 $37 。
     * \
     * 输入：customers = [10,9,6], boardingCost = 6, runningCost = 4
     * 输出：7
     * 解释：
     * 1. 10 位游客抵达，4 位登舱，6 位等待下一舱，摩天轮轮转。当前利润为 4 * $6 - 1 * $4 = $20 。
     * 2. 9 位游客抵达，4 位登舱，11 位等待（2 位是先前就在等待的，9 位新加入等待的），摩天轮轮转。当前利润为 8 * $6 - 2 * $4 = $40 。
     * 3. 最后 6 位游客抵达，4 位登舱，13 位等待，摩天轮轮转。当前利润为 12 * $6 - 3 * $4 = $60 。
     * 4. 4 位登舱，9 位等待，摩天轮轮转。当前利润为 * $6 - 4 * $4 = $80 。
     * 5. 4 位登舱，5 位等待，摩天轮轮转。当前利润为 20 * $6 - 5 * $4 = $100 。
     * 6. 4 位登舱，1 位等待，摩天轮轮转。当前利润为 24 * $6 - 6 * $4 = $120 。
     * 7. 1 位登舱，摩天轮轮转。当前利润为 25 * $6 - 7 * $4 = $122 。
     * 轮转 7 次得到最大利润，最大利润为$122 。
     * \
     * @param args args
     */
    public static void main(String[] args) {
        MinOperationsMaxProfit minOperationsMaxProfit = new MinOperationsMaxProfit();
        int[] customers = new int[]{8, 3};
        int boardingCost = 5;
        int runningCost = 6;
        System.out.println(minOperationsMaxProfit.minOperationsMaxProfit(customers, boardingCost, runningCost));
    }

    /**
     * 最小操作最大利润
     * 模拟
     * @param customers    客户
     * @param boardingCost 寄宿费用
     * @param runningCost  运行成本
     * @return int
     */
    public int minOperationsMaxProfit(int[] customers, int boardingCost, int runningCost) {
        int ans = -1;
        int len = customers.length;
        //分别定义消费者，费用，最大花费
        int customer = 0, cost = 0, max = 0;
        for (int i = 0; i < len || customer > 0; i++) {
            //每轮添加消费者
            if (i < len) {
                customer += customers[i];
            }
            //获取一轮上摩天轮的人数
            int min = Math.min(customer, 4);
            //计算此轮费用
            cost += min * boardingCost - runningCost;
            //扣除上摩天轮的人
            customer -= min;
            //费用相较于上一轮盈利的话则可以继续运行
            if (max < cost) {
                max = cost;
                ans = i + 1;
            }

        }
        return ans;
    }

}
